package com.czk.scala.chapter05

/**
 * 匿名函数的原则
 * 1 参数类型可以省略，会根据形参进行自动的推导
 * 2 类型省略后，如果只有一个参数，则括号可以省略
 * 3 函数体只有一行，则花括号可以省略
 * 4 如果参数只出现一次，则参数省略且可以用_代替
 *
 * @Author:ChenZhangKun
 * @Date: 2021/12/9 17:29
 */
object Test04_Lambda {
  def main(args: Array[String]): Unit = {
    // 定义匿名函数
    val fun = (name: String) => println(name)

    // 定义函数，以函数作为输入

    def f(func: String => Unit): Unit = {
      func("czk")
    }

    f(fun)


    // 定义一个二元运算函数，只操作1和2两个数，具体运算通过参数传入
    // 函数作为值传递
    def dualFunc(fun: (Int, Int) => Int): Int = {
      fun(1, 2)
    }

    // 定义操作函数
    val add = (x: Int, y: Int) => x + y
    val desc = (x: Int, y: Int) => x - y

    println(dualFunc(add))
    println(dualFunc(desc))
    // 匿名函数的简化
    println(dualFunc((x, y) => x * y))
    // 用_代替 两个数相加
    println(dualFunc(_ + _))


    def f3(fun: (Int, Int) => Int): Int = {
      fun(1, 2)
    }

    // 定义相乘函数
    def mul = (x: Int, y: Int) => x * y

    println(f3(mul))
  }
}
